package com.mj.mafeed.util;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.Map;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import com.mj.mafeed.config.Constants;

/**
 * Http请求的工具类
 * 
 * @author zhaominglei
 * @date 2014-12-6
 * 
 */
public class HttpUtils {
	private static final int TIMEOUT_IN_MILLIONS = 60*60*1000;
	private static String BOUNDARY = "---------------------------" + new Date().getTime();
	private static String TWOHYPHENS = "--";
//	private static String LINEEND = System.getProperty("line.separator");
	private static String LINEEND = "\r\n";
	
	public interface CallBack {
		void onRequestComplete(String result);
	}

	/**
	 * 异步的Get请求
	 * 
	 * @param urlStr
	 * @param callBack
	 */
	public static void doGetAsyn(final String urlStr, final CallBack callBack) {
		new Thread() {
			public void run() {
				try {
					String result = doGet(urlStr);
					if (callBack != null) {
						callBack.onRequestComplete(result);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			};
		}.start();
	}

	/**
	 * 异步的Post请求
	 * 
	 * @param urlStr
	 * @param params
	 * @param callBack
	 * @throws Exception
	 */
	public static void doPostAsyn(final String urlStr, final String params,
			final CallBack callBack) throws Exception {
		new Thread() {
			public void run() {
				try {
					String result = doPost(urlStr, params);
					if (callBack != null) {
						callBack.onRequestComplete(result);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			};
		}.start();

	}

	/**
	 * Get请求，获得返回数据
	 * 
	 * @param urlStr
	 * @return
	 * @throws Exception
	 */
	public static String doGet(String urlStr) {
		URL url = null;
		HttpURLConnection conn = null;
		InputStream is = null;
		ByteArrayOutputStream baos = null;
		try {
			url = new URL(urlStr);
			conn = (HttpURLConnection) url.openConnection();
			conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
			conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
			conn.setRequestMethod("GET");
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			if (conn.getResponseCode() == 200) {
				is = conn.getInputStream();
				baos = new ByteArrayOutputStream();
				int len = -1;
				byte[] buf = new byte[128];

				while ((len = is.read(buf)) != -1) {
					baos.write(buf, 0, len);
				}
				baos.flush();
				return baos.toString();
			} else {
				throw new RuntimeException(" responseCode is not 200 ... ");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (is != null)
					is.close();
			} catch (IOException e) {
			}
			try {
				if (baos != null)
					baos.close();
			} catch (IOException e) {
			}
			conn.disconnect();
		}

		return null;

	}

	/**
	 * 向指定 URL 发送POST方法的请求
	 * 
	 * @param url
	 *            发送请求的 URL
	 * @param param
	 *            请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
	 * @return 所代表远程资源的响应结果
	 * @throws Exception
	 */
	public static String doPost(String url, String param) {
		PrintWriter out = null;
		BufferedReader in = null;
		String result = "";
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			HttpURLConnection conn = (HttpURLConnection) realUrl
					.openConnection();
			// 设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Content-Type",
					"application/x-www-form-urlencoded");
			conn.setRequestProperty("Referer", "http://meiaochina.cn/index.shtml");
			conn.setUseCaches(false);
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
			conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);

			if (param != null && !param.trim().equals("")) {
				// 获取URLConnection对象对应的输出流
				out = new PrintWriter(conn.getOutputStream());
				// 发送请求参数
				out.print(param);
				// flush输出流的缓冲
				out.flush();
			}
			// 定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(
					new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 使用finally块来关闭输出流、输入流
		finally {
			try {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return result;
	}
	
	/**
	 * POST 带文件上传
	 */
	public static String doPostWithFiles(String url, Map<String, Object> params) {
		DataOutputStream output = null; 
		BufferedReader in = null;
		String result = "";
		try {
			URL realUrl = new URL(url);
			HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();
			conn.setUseCaches(false);
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
			conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Connection", "keep-alive");
			conn.setRequestProperty("Charset", "utf-8");
			conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+BOUNDARY);
			output = new DataOutputStream(conn.getOutputStream());
			addFormField(params, output); 
            output.writeBytes(TWOHYPHENS + BOUNDARY + TWOHYPHENS + LINEEND);//数据结束标志 
            output.flush();
            
			in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (output != null) {
					output.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return result;
	}
	
	//添加表单项 
	private static void addFormField(Map<String, Object> params, DataOutputStream output) {
		try {
			for (Map.Entry<String, Object> param : params.entrySet()) {
				String formName = param.getKey();
				Object object = param.getValue();
				
				StringBuilder sb = new StringBuilder();
				sb.append(TWOHYPHENS + BOUNDARY + LINEEND);
				if (object instanceof File) {
					File file = (File)object;
					sb.append("Content-Disposition: form-data; name=\""
							+ formName + "\"; filename=\""
							+ file.getName() + "\"" + LINEEND);
					sb.append(LINEEND);
					output.writeBytes(sb.toString());
					InputStream inputStream = new FileInputStream(file);
					byte[] bytes = new byte[1024];
					int len = -1;
					while ((len = inputStream.read(bytes)) != -1) {
						output.write(bytes, 0, len);
					}
					output.writeBytes(LINEEND);
					inputStream.close();
				} else {
					sb.append("Content-Disposition: form-data; name=\""
							+ param.getKey() + "\"" + LINEEND);
					sb.append("Content-Type: text/plain; charset=utf-8" + LINEEND);
					sb.append(LINEEND).append(param.getValue()).append(LINEEND);
					output.write(sb.toString().getBytes("utf-8"));
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/*
	 * 获取网络图片
	 */
    public static Bitmap returnBitMap(String url){
    	URL imageUrl = null;  
    	Bitmap bitmap = null; 
    	try {  
    		imageUrl = new URL(Constants.SERVER_DOWNLOAD_URL+url);  
    	} catch (MalformedURLException e) {  
    		e.printStackTrace();  
    	}  
    	try {  
    		HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();  
    		conn.setDoInput(true);  
    		conn.connect();  
    		InputStream is = conn.getInputStream();  
    		bitmap = BitmapFactory.decodeStream(is);  
    		is.close();  
    	} catch (IOException e) {  
    		 e.printStackTrace();  
    	}  
    	return bitmap;  
    } 
}
